类(Class)和实例(Instance)

类是抽象的模板
实例是根据类创建出来的一个个具体的“对象”
每个对象都拥有相同的方法,但各自的数据可能不同
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;

super

class OldDog():  
   def __init__(self):  
       print('I am an old dog !')
       self.hungry = True  

   def eat(self):  
       if self.hungry:  
           print('I eat it !')
           self.hungry = False  
       else:  
           print('No thanks!')

class NewDog(OldDog):  
   def __init__(self):  
       super().__init__()  
       print('I am a new dog!')

olddog = OldDog()
olddog.eat()
olddog.eat()
newdog = NewDog()
newdog.eat()
newdog.eat()

当子类继承父类的时候,我们继承了父类的方法。子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用    

repr

  • 作用
返回实例化对象的表达
  • code
class MyClass() :
    def __str__(self) :
        return "我是MyClass的一个实例"
    def __repr__(self) :
        return "这回连print都省了"
 
a=MyClass()
  • result
>>> print(a)
我是MyClass的一个实例
>>> a
这回连print都省了
  • 链接
一个flask json返回值的问题
https://www.v2ex.com/t/195379

new__、__init__、__call

__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)
__init__ : 对象的初始化, 是一个实例方法,第一个参数是self。
__call__ : 对象可call,注意不是类,是对象
先有创建,才有初始化。即先__new__,而后__init__。
  • new
class Bar(object): 
  pass
  
class Foo(object): 
  def __new__(cls, *args, **kwargs): 
    return Bar() 
  
print Foo()
输出来是一个Bar对象
  • init
class Person(object):
  """Silly Person"""
 
  def __init__(self, name, age):
    self.name = name
    self.age = age
 
  def __str__(self):
    return '<Person: %s(%s)>' % (self.name, self.age)
 
if __name__ == '__main__':
  piglei = Person('piglei', 24)
  print piglei
这样便是__init__最普通的用法了。但__init__其实不是实例化一个类的时候第一个被调用 的方法。
当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__ 方法。
  • call
对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2) 。模拟函数的对象可以用于创建防函数(functor) 或代理(proxy).
class Foo(object): 
  def __call__(self): 
    pass
  
f = Foo()#类Foo可call 
f()#对象f可call

EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术